﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using PAT.Entities;
using PAT.Services;
using PAT.Data.Bases;
using PAT.Util;

public partial class aspx_tal02_ConfiguracionKits : System.Web.UI.Page
{
    #region Atributos

    /// <summary>
    /// Objeto que almacena los items(repuestos) asociados al kit
    /// </summary>
    private DataTable dtItemsKit;

    /// <summary>
    /// Objeto que almacena las operaciones asociadas al kit
    /// </summary>
    private DataTable dtOperacionesKit;

    #endregion

    #region Eventos

    /// <summary>
    /// Evento que se dispara siempre que se recarga la página
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            CargarComboGrupoCatalogo();
            CargarComboListasPrecios();
            if (Request.QueryString["mode"] != null)
            {
                if (int.Parse(Request.QueryString["mode"]) == (int)Modos.Creacion)
                {
                    if (Request.QueryString["ok"] != null)
                        ScriptManager.RegisterStartupScript(this, typeof(Page), "scrOK", "alert('El kit se creó satisfactoriamente');", true);
                    CargarEstructuraItems();
                    EnlazarGrillaItems();
                    CargarEstructuraOperaciones();
                    EnlazarGrillaOperaciones();
                }
                else if (int.Parse(Request.QueryString["mode"]) == (int)Modos.Modificacion)
                {
                    if (Request.QueryString["idKit"] != null)
                    {
                        if (Request.QueryString["ok"] != null)
                            ScriptManager.RegisterStartupScript(this, typeof(Page), "scrOK", "alert('El kit se modificó satisfactoriamente');", true);
                        CargarInformacionKit();
                        CargarItemsKit();
                        CargarOperacionesKit();
                        btnAceptar.Visible = false;
                        accObjetosRelacionados.Visible = true;
                    }
                }
            }
        }
        else
        {
            if (ViewState["dtItemsKit"] != null)
                dtItemsKit = (DataTable)ViewState["dtItemsKit"];
            if (ViewState["dtOperacionesKit"] != null)
                dtOperacionesKit = (DataTable)ViewState["dtOperacionesKit"];
        }
    }

    /// <summary>
    /// Evento para salir del formulario sin salvar cambios
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void ibExit_Click(object sender, ImageClickEventArgs e)
    {
        Response.Redirect("../inicio/Home.aspx");
    }

    /// <summary>
    /// Evento para salvar los cambios realizados a un kit
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void ibSave_Click(object sender, ImageClickEventArgs e)
    {
        if (int.Parse(Request.QueryString["mode"]) == (int)Modos.Creacion)
        {
            PatKit objKit = new PatKit();
            objKit.Activo = true;
            objKit.DescripcionKit = txtDescripcion.Text.Trim();
            objKit.IdGrupoCatalogo = Convert.ToInt16(ddlGrupo.SelectedValue);
            objKit.IdListaPrecios = Convert.ToInt32(ddlLista.SelectedValue);
            PatKitService objService = new PatKitService();
            if (objService.Insert(objKit))
            {
                if (dtItemsKit.Rows.Count > 0)
                {
                    TList<PatKitItem> itemsKit = new TList<PatKitItem>();
                    foreach (DataRow itemKit in dtItemsKit.Rows)
                    {
                        PatKitItem item = new PatKitItem();
                        item.Activo = true;
                        item.IdItemInventario = Convert.ToInt32(itemKit["ID_ITEM_INVENTARIO"]);
                        item.IdKit = objKit.IdKit;
                        itemsKit.Add(item);
                    }
                    PatKitItemService objKitItemService = new PatKitItemService();
                    objKitItemService.Insert(itemsKit);
                }
                if (dtOperacionesKit.Rows.Count > 0)
                {
                    TList<PatKitOperacion> operacionesKit = new TList<PatKitOperacion>();
                    foreach (DataRow operacionKit in dtOperacionesKit.Rows)
                    {
                        PatKitOperacion operacion = new PatKitOperacion();
                        operacion.Activo = true;
                        operacion.IdKit = objKit.IdKit;
                        operacion.IdOperacion = Convert.ToInt32(operacionKit["ID_OPERACION"]);
                        operacionesKit.Add(operacion);
                    }
                    PatKitOperacionService objKitOperacionService = new PatKitOperacionService();
                    objKitOperacionService.Insert(operacionesKit);
                }
                Response.Redirect("ConfiguracionKits.aspx?mode=0&ok=1");
            }
            else
                ScriptManager.RegisterStartupScript(this, typeof(Page), "scrKO", "alert('Ha ocurrido un error en la creación del kit');", true);
        }
        else if (int.Parse(Request.QueryString["mode"]) == (int)Modos.Modificacion)
        {
            PatKit objKit = new PatKit();
            objKit.Activo = true;
            objKit.DescripcionKit = txtDescripcion.Text.Trim();
            objKit.IdGrupoCatalogo = Convert.ToInt16(ddlGrupo.SelectedValue);
            objKit.IdKit = Convert.ToInt32(ViewState["IdKit"]);
            objKit.IdListaPrecios = Convert.ToInt32(ddlLista.SelectedValue);
            PatKitService objService = new PatKitService();
            if (objService.Update(objKit))
            {
                DataTable dtItemsAgregados = dtItemsKit.GetChanges(DataRowState.Added);
                DataTable dtItemsEliminados = dtItemsKit.GetChanges(DataRowState.Deleted);
                TList<PatKitItem> itemsKit = new TList<PatKitItem>();
                if (dtItemsAgregados != null && dtItemsAgregados.Rows.Count > 0)
                {
                    foreach (DataRow itemKit in dtItemsAgregados.Rows)
                    {
                        PatKitItem item = new PatKitItem();
                        item.Activo = true;
                        item.IdItemInventario = Convert.ToInt32(itemKit["ID_ITEM_INVENTARIO"]);
                        item.OriginalIdItemInventario = Convert.ToInt32(itemKit["ID_ITEM_INVENTARIO"]);
                        item.IdKit = objKit.IdKit;
                        item.OriginalIdKit = objKit.IdKit;
                        item.EntityState = EntityState.Added;
                        itemsKit.Add(item);
                    }
                }
                if (dtItemsEliminados != null && dtItemsEliminados.Rows.Count > 0)
                {
                    DataView dvEliminados = new DataView(dtItemsEliminados, string.Empty, string.Empty, DataViewRowState.Deleted);
                    foreach (DataRowView itemKit in dvEliminados)
                    {
                        PatKitItem item = new PatKitItem();
                        item.Activo = false;
                        item.IdItemInventario = Convert.ToInt32(itemKit["ID_ITEM_INVENTARIO"]);
                        item.OriginalIdItemInventario = Convert.ToInt32(itemKit["ID_ITEM_INVENTARIO"]);
                        item.IdKit = objKit.IdKit;
                        item.OriginalIdKit = objKit.IdKit;
                        item.EntityState = EntityState.Deleted;
                        itemsKit.Add(item);
                    }
                }
                if (itemsKit.Count != 0)
                {
                    PatKitItemService objKitItemService = new PatKitItemService();
                    objKitItemService.DeepSave(itemsKit, PAT.Data.DeepSaveType.ExcludeChildren, new System.Type[] { });
                }

                TList<PatKitOperacion> operacionesKit = new TList<PatKitOperacion>();
                DataTable dtOperacionesAgregadas = dtOperacionesKit.GetChanges(DataRowState.Added);
                DataTable dtOperacionesEliminadas = dtOperacionesKit.GetChanges(DataRowState.Deleted);
                if (dtOperacionesAgregadas != null && dtOperacionesAgregadas.Rows.Count != 0)
                {
                    foreach (DataRow operacionKit in dtOperacionesAgregadas.Rows)
                    {
                        PatKitOperacion operacion = new PatKitOperacion();
                        operacion.Activo = true;
                        operacion.IdKit = objKit.IdKit;
                        operacion.OriginalIdKit = objKit.IdKit;
                        operacion.IdOperacion = Convert.ToInt32(operacionKit["ID_OPERACION"]);
                        operacion.OriginalIdOperacion = Convert.ToInt32(operacionKit["ID_OPERACION"]);
                        operacion.EntityState = EntityState.Added;
                        operacionesKit.Add(operacion);
                    }
                }
                if (dtOperacionesEliminadas != null && dtOperacionesEliminadas.Rows.Count != 0)
                {
                    DataView dvEliminados = new DataView(dtOperacionesEliminadas, string.Empty, string.Empty, DataViewRowState.Deleted);
                    foreach (DataRowView operacionKit in dvEliminados)
                    {
                        PatKitOperacion operacion = new PatKitOperacion();
                        operacion.Activo = false;
                        operacion.IdKit = objKit.IdKit;
                        operacion.OriginalIdKit = objKit.IdKit;
                        operacion.IdOperacion = Convert.ToInt32(operacionKit["ID_OPERACION"]);
                        operacion.OriginalIdOperacion = Convert.ToInt32(operacionKit["ID_OPERACION"]);
                        operacion.EntityState = EntityState.Deleted;
                        operacionesKit.Add(operacion);
                    }
                }
                if (operacionesKit.Count != 0)
                {
                    PatKitOperacionService objKitOperacionService = new PatKitOperacionService();
                    objKitOperacionService.DeepSave(operacionesKit, PAT.Data.DeepSaveType.ExcludeChildren, new System.Type[] { });
                }
                Response.Redirect("ConfiguracionKits.aspx?mode=1&idKit=" + ViewState["IdKit"].ToString() + "&ok=2");
            }
            else
                ScriptManager.RegisterStartupScript(this, typeof(Page), "scrKO", "alert('Ha ocurrido un error en la modificación del kit');", true);
        }
    }

    /// <summary>
    /// Evento para realizar acciones de último momento antes de terminar el enlace a datos de la grilla
    /// de operaciones
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void dgOperacionesKit_ItemDataBound(object sender, DataGridItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Footer)
        {
            DropDownList comboOperaciones = (DropDownList)e.Item.FindControl("ddlOperacion");
            CargarComboOperaciones(comboOperaciones);
        }
    }

    /// <summary>
    /// Evento para agregar o remover operaciones de la grilla
    /// </summary>
    /// <param name="source"></param>
    /// <param name="e"></param>
    protected void dgOperacionesKit_ItemCommand(object source, DataGridCommandEventArgs e)
    {
        if (e.CommandName == "addItem")
        {
            DataRow fila = dtOperacionesKit.NewRow();
            if (int.Parse(Request.QueryString["mode"]) == (int)Modos.Creacion)
            {
                fila["ID_OPERACION"] = int.Parse(((DropDownList)e.Item.FindControl("ddlOperacion")).SelectedValue);
                fila["DESCRIPCION_OPERACION"] = ((Label)e.Item.FindControl("lbNombreOperacion")).Text;
                fila["TIEMPO_CLIENTE"] = double.Parse(((Label)e.Item.FindControl("lbTiempoOperacion")).Text);
                dtOperacionesKit.Rows.Add(fila);
            }
            else if (int.Parse(Request.QueryString["mode"]) == (int)Modos.Modificacion)
            {
                fila["ID_KIT"] = Convert.ToInt32(ViewState["IdKit"]);
                fila["ID_OPERACION"] = int.Parse(((DropDownList)e.Item.FindControl("ddlOperacion")).SelectedValue);
                fila["DESCRIPCION_OPERACION"] = ((Label)e.Item.FindControl("lbNombreOperacion")).Text;
                fila["TIEMPO_CLIENTE"] = double.Parse(((Label)e.Item.FindControl("lbTiempoOperacion")).Text);
                dtOperacionesKit.Rows.Add(fila);
            }
            EnlazarGrillaOperaciones();
        }
        else if (e.CommandName == "delItem")
        {
            int indice = e.Item.ItemIndex;
            dtOperacionesKit.Rows[indice].Delete();
            EnlazarGrillaOperaciones();
        }
    }

    /// <summary>
    /// Evento para agregar o remover items de la grilla
    /// </summary>
    /// <param name="source"></param>
    /// <param name="e"></param>
    protected void dgItemsKit_ItemCommand(object source, DataGridCommandEventArgs e)
    {
        if (e.CommandName == "addItem")
        {
            DataRow fila = dtItemsKit.NewRow();
            if (int.Parse(Request.QueryString["mode"]) == (int)Modos.Creacion)
            {
                fila["ID_ITEM_INVENTARIO"] = Convert.ToInt32(((HtmlInputHidden)e.Item.FindControl("hdnIdItem")).Value);
                fila["DESCRIPCION_ITEM"] = ((DropDownList)e.Item.FindControl("ddlItem")).SelectedItem.Text;
                fila["USO_X_VEHICULO"] = Convert.ToInt32(((Label)e.Item.FindControl("lbCantidad")).Text);
                dtItemsKit.Rows.Add(fila);
            }
            else if (int.Parse(Request.QueryString["mode"]) == (int)Modos.Modificacion)
            {
                fila["ID_KIT"] = Convert.ToInt32(ViewState["IdKit"]);
                fila["ID_ITEM_INVENTARIO"] = Convert.ToInt32(((HtmlInputHidden)e.Item.FindControl("hdnIdItem")).Value);
                fila["DESCRIPCION_ITEM"] = ((DropDownList)e.Item.FindControl("ddlItem")).SelectedItem.Text;
                fila["USO_X_VEHICULO"] = Convert.ToInt32(((Label)e.Item.FindControl("lbCantidad")).Text);
                dtItemsKit.Rows.Add(fila);
            }
            EnlazarGrillaItems();
        }
        else if (e.CommandName == "delItem")
        {
            int indice = e.Item.ItemIndex;
            dtItemsKit.Rows[indice].Delete();
            EnlazarGrillaItems();
        }
    }

    /// <summary>
    /// Evento que se dispara al cambiar el elemento seleccionado en el combo de operaciones
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void ddlOperacion_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList ddlOperacion = (DropDownList)sender;
        DataGridItem rowParent = ((DropDownList)sender).Parent.Parent as DataGridItem;
        if (ddlOperacion.SelectedValue != string.Empty)
        {
            PatTempario operacion = new PatTempario();
            PatTemparioService servicio = new PatTemparioService();
            PatTiempoTallerService objTiempoTallerService = new PatTiempoTallerService();
            TList<PatTiempoTaller> objTiempoTaller = new TList<PatTiempoTaller>();
            PatTiempoTaller objEncontrado = new PatTiempoTaller();
            objTiempoTaller = objTiempoTallerService.GetByIdOperacion(int.Parse(ddlOperacion.SelectedValue));
            objEncontrado = objTiempoTaller.Find(delegate(PatTiempoTaller p) { return p.IdGrupoCatalogo == short.Parse(ddlGrupo.SelectedValue); });
            if (objEncontrado != null)
            {
                ((Label)rowParent.FindControl("lbNombreOperacion")).Text = ddlOperacion.SelectedItem.Text;
                ((Label)rowParent.FindControl("lbTiempoOperacion")).Text = objTiempoTaller[0].TiempoCliente.ToString();
            }
            else
            {
                operacion = servicio.GetByIdOperacion(int.Parse(ddlOperacion.SelectedValue));
                if (operacion != null)
                {
                    ((Label)rowParent.FindControl("lbNombreOperacion")).Text = ddlOperacion.SelectedItem.Text;
                    ((Label)rowParent.FindControl("lbTiempoOperacion")).Text = operacion.TiempoEstandar.ToString();
                }
            }
        }
    }

    /// <summary>
    /// Evento que se dispara al cambiar el elemento seleccionado en el combo de items
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void ddlItem_SelectedIndexChanged(object sender, EventArgs e)
    {
        int cantidad = 0;
        DropDownList ddlItem = (DropDownList)sender;
        DataGridItem rowParent = ((DropDownList)sender).Parent.Parent as DataGridItem;
        PatItemInventarioService objService = new PatItemInventarioService();
        DataSet dsUso = objService.GetUsoXVehiculo(Convert.ToInt32(ddlItem.SelectedValue), null, Convert.ToInt32(ddlGrupo.SelectedValue));
        if (dsUso != null && dsUso.Tables.Count != 0 && dsUso.Tables[0].Rows.Count != 0)
            cantidad = Convert.ToInt32(dsUso.Tables[0].Rows[0][0]);
        ((HtmlInputHidden)rowParent.FindControl("hdnIdItem")).Value = ddlItem.SelectedValue;
        ((Label)rowParent.FindControl("lbCantidad")).Text = cantidad.ToString();
    }

    /// <summary>
    /// Evento para realizar cambios de último momento antes que la grilla de items termine su enlace a
    /// datos
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void dgItemsKit_ItemDataBound(object sender, DataGridItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Footer)
        {
            DropDownList comboItems = (DropDownList)e.Item.FindControl("ddlItem");
            CargarComboItems(comboItems);
        }
    }

    /// <summary>
    /// Evento que se dispara al validar la información básica del kit ingresada
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnAceptar_Click(object sender, EventArgs e)
    {
        accObjetosRelacionados.Visible = true;
    }

    /// <summary>
    /// Evento para volver al listado de Kits
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void ibVolver_Click(object sender, ImageClickEventArgs e)
    {
        Response.Redirect("../params/PatKit.aspx");
    }

    #endregion

    #region Métodos

    /// <summary>
    /// Enlaza el combo de grupos a datos
    /// </summary>
    protected void CargarComboGrupoCatalogo()
    {
        PatGrupoCatalogoService objGrupoCatalogoService = new PatGrupoCatalogoService();
        TList<PatGrupoCatalogo> objGrupoCatalogo = new TList<PatGrupoCatalogo>();
        objGrupoCatalogo = objGrupoCatalogoService.GetAll();
        UtilUI.BindListControl(ddlGrupo, objGrupoCatalogo, "IdGrupoCatalogo", "DescripcionGrupoCatalogo", true);
    }

    /// <summary>
    /// Enlaza el combo de listas de precios a datos
    /// </summary>
    protected void CargarComboListasPrecios()
    {
        PatListaPreciosTallerService objListaPreciosService = new PatListaPreciosTallerService();
        TList<PatListaPreciosTaller> objListaPrecios = new TList<PatListaPreciosTaller>();
        objListaPrecios = objListaPreciosService.GetAll();
        UtilUI.BindListControl(ddlLista, objListaPrecios, "IdListaPrecios", "DescripcionListaPrecios", true);
    }

    /// <summary>
    /// Obtiene los items asociados al kit y enlaza la grilla a los mismos
    /// </summary>
    protected void CargarItemsKit()
    {
        dtItemsKit = new DataTable();
        PatKitItemService objKitItemService = new PatKitItemService();
        dtItemsKit = objKitItemService.GetItemsByIdKit(Convert.ToInt32(ViewState["IdKit"]), int.Parse(ddlGrupo.SelectedValue)).Tables[0];
        EnlazarGrillaItems();
    }

    /// <summary>
    /// Obtiene las operaciones asociadas al kit y enlaza la grilla a las mismas 
    /// </summary>
    protected void CargarOperacionesKit()
    {
        dtOperacionesKit = new DataTable();
        PatKitOperacionService objKitOperacionService = new PatKitOperacionService();
        dtOperacionesKit = objKitOperacionService.GetOperacionesByIdKit(Convert.ToInt32(ViewState["IdKit"]), int.Parse(ddlGrupo.SelectedValue)).Tables[0];
        EnlazarGrillaOperaciones();
    }

    /// <summary>
    /// Obtiene la información básica del kit y la enlaza a los controles de UI
    /// </summary>
    protected void CargarInformacionKit()
    {
        PatKitService objKitService = new PatKitService();
        PatKit objKit = new PatKit();
        objKit = objKitService.GetByIdKit(int.Parse(Request.QueryString["idKit"]));
        if (objKit != null)
        {
            ViewState["IdKit"] = objKit.IdKit;
            txtDescripcion.Text = objKit.DescripcionKit;
            ddlGrupo.SelectedValue = objKit.IdGrupoCatalogo.ToString();
            ddlLista.SelectedValue = objKit.IdListaPrecios.ToString();
        }
    }

    /// <summary>
    /// Define la estructura del DataTable de Items
    /// </summary>
    protected void CargarEstructuraItems()
    {
        dtItemsKit = new DataTable();
        dtItemsKit.Columns.Add("ID_KIT", typeof(int));
        dtItemsKit.Columns.Add("ID_ITEM_INVENTARIO", typeof(int));
        dtItemsKit.Columns.Add("DESCRIPCION_ITEM", typeof(string));
        dtItemsKit.Columns.Add("USO_X_VEHICULO", typeof(int));
    }

    /// <summary>
    /// Enlaza la grilla de items a datos
    /// </summary>
    protected void EnlazarGrillaItems()
    {
        dgItemsKit.DataSource = dtItemsKit;
        dgItemsKit.DataBind();
        ViewState["dtItemsKit"] = dtItemsKit;
    }

    /// <summary>
    /// Enlaza la grilla de operaciones a datos
    /// </summary>
    protected void EnlazarGrillaOperaciones()
    {
        dgOperacionesKit.DataSource = dtOperacionesKit;
        dgOperacionesKit.DataBind();
        ViewState["dtOperacionesKit"] = dtOperacionesKit;
    }

    /// <summary>
    /// Estructura y llena la grilla de items
    /// </summary>
    protected void CargarGrillaItems()
    {
        CargarEstructuraItems();
        EnlazarGrillaItems();
    }

    /// <summary>
    /// Estructura y llena la grilla de operaciones
    /// </summary>
    protected void CargarGrillaOperaciones()
    {
        CargarEstructuraOperaciones();
        EnlazarGrillaOperaciones();
    }

    /// <summary>
    /// Define la estructura de la tabla de operaciones
    /// </summary>
    protected void CargarEstructuraOperaciones()
    {
        dtOperacionesKit = new DataTable();
        dtOperacionesKit.Columns.Add("ID_KIT", typeof(int));
        dtOperacionesKit.Columns.Add("ID_OPERACION", typeof(int));
        dtOperacionesKit.Columns.Add("DESCRIPCION_OPERACION", typeof(string));
        dtOperacionesKit.Columns.Add("TIEMPO_CLIENTE", typeof(double));
    }

    /// <summary>
    /// Obtiene las distintas operaciones del tempario y enlaza el combo a las mismas
    /// </summary>
    /// <param name="comboOperaciones"></param>
    protected void CargarComboOperaciones(DropDownList comboOperaciones)
    {
        PatTemparioService objService = new PatTemparioService();
        TList<PatTempario> objOperacionTaller = new TList<PatTempario>();
        objOperacionTaller = objService.GetAll();
        objOperacionTaller = objOperacionTaller.FindAll(delegate(PatTempario p) { return p.Activo = true; });
        UtilUI.BindListControl(comboOperaciones, objOperacionTaller, "IdOperacion", "DescripcionOperacion", true);
    }

    /// <summary>
    /// Obtiene los distintos items del catálogo y enlaza el combo a los mismos
    /// </summary>
    /// <param name="comboItems"></param>
    protected void CargarComboItems(DropDownList comboItems)
    {
        PatItemInventarioService objService = new PatItemInventarioService();
        TList<PatItemInventario> items = new TList<PatItemInventario>();
        items = objService.GetAll();
        items = items.FindAll(delegate(PatItemInventario p) { return p.Activo; });
        UtilUI.BindListControl(comboItems, items, "IdItemInventario", "DescripcionItem", true);
    }

    #endregion 
}